#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>
#include<list>
#include<map>
#include<string>
using namespace std;

//struct Point
//{
//	int _x;
//	int _y;
//};
//
//class Date
//{
//public:
//	Date(int year, int month, int day)
//		:_year(year)
//		, _month(month)
//		, _day(day)
//	{
//		cout << "Date(int year, int month, int day)" << endl;
//	}
//private:
//	int _year;
//	int _month;
//	int _day;
//};

//int main()
//{
//	//int array1[] = { 1, 2, 3, 4, 5 };
//	//int array2[5] = { 0 };
//
//	//Point p = { 1, 2 };
//
//	////多参数的隐式类型转换中间会产生临时变量
//	////Date d1 = { 2024,10,17 };//临时对象去拷贝构造，被优化为构造
//	////const Date& d1 = { 2024,10,17 };//临时对象+拷贝构造
//
//	//int* pa = new int[4] {0};
//
//	//Point p{ 1,2 };
//	//int x2{ 2 };
//
//	//Date d1{ 2024, 10, 17 };
//	//const Date& d1{ 2024, 10, 17 };
//
//	/*vector<int> v = { 1, 2, 3,4 };
//	map<string, string> dict = { {"sort","排序"},{"insert","插入"} };
//	v = { 10, 20, 30 };*/
//
//	int i = 10;
//	auto p = &i;
//	auto pf = strcpy;
//	cout << typeid(p).name() << endl;
//	cout << typeid(pf).name() << endl;
//	map<string, string> dict = { {"sort", "排序"}, {"insert", "插入"} };
//	//map<string, string>::iterator it = dict.begin();
//	auto it = dict.begin();
//
//
//	return 0;
//}

// decltype的一些使用使用场景
//template<class T1, class T2>
//void F(T1 t1, T2 t2)
//{
//	decltype(t1 * t2) ret;
//	cout << typeid(ret).name() << endl;
//}
//
//int main()
//{
//	const int x = 1;
//	double y = 2.2;
//	decltype(x * y) ret; // ret的类型是double
//	decltype(&x) p;      // p的类型是int*
//	cout << typeid(ret).name() << endl;
//	cout << typeid(p).name() << endl;
//	F(1, 'a');
//
//	return 0;
//}

//// 左值引用
//int main()
//{
//	int* p = new int(0);
//	int b = 1;
//	const int c = b;
//	*p = 10;
//	string s("1111111");
//	s[0];
//
//	cout << &c << endl;//左值可以取地址
//	cout << &s[0] << endl;//左值可以取地址
//
//	//左值引用给左值取别名
//	int& r1 = b;
//	int*& r2 = p;
//	int& r3 = *p;
//
//	return 0;
//}

// 右值引用
int main()
{
	//以下几个为右值（数据表达式）：不能取地址
	//通常为常量、匿名对象、临时对象
	//本质：右值都是一些临时性的对象（临时存储的对象）
	double x = 1.1, y = 2.2;
	10;
	x + y;//用临时对象来存储+之后的结果
	fmin(x, y);//用临时对象存储返回值的结果
	//double fmin(double x, double y)两个值进行比较再进行传值返回
	string("1111111");//匿名对象，生命周期只在这一行，出了作用域就销毁了

	//cout << &10 << endl;//不能取地址
	//cout << &(x + y) << endl;//不能取地址
	//cout << &(fmin(x, y)) << endl;//不能取地址
	//cout << &(string("1111111")) << endl;//不能取地址


	//右值引用给右值取别名
	/*int&& rr1 = 10;
	double&& rr2 = x + y;
	double&& rr3 = fmin(x, y);*/

	//const左值引用即可引用左值，也可引用右值
	const int& rx1 = 10;
	const double& rx2 = x + y;
	const double& rx3 = fmin(x, y);
	const string& rx4 = string("11111111");

	vector<string> v;
	string s1("11111");
	v.push_back(s1);
	v.push_back(string("11111"));//右值对象
	v.push_back("111111");//单参数构造函数，支持隐式类型转换



	return 0;
}

